package com.easypan.aspect;

import com.easypan.annotation.GlobalInterceptor;
import com.easypan.entity.dto.SessionwebUserDto;
import com.easypan.entity.po.UserInfo;
import com.easypan.enums.ResponseCodeEnum;
import com.easypan.exception.BusinessException;
import com.easypan.mapper.UserMapper;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import com.easypan.entity.configA.cofig;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.lang.reflect.Method;
@Component
@Aspect
public class GlobalOperationAspect {

    @Autowired
    private cofig cogig;
    @Autowired
    UserMapper userMapper;
    @Pointcut("@annotation(com.easypan.annotation.GlobalInterceptor)")
    private void requestInterceptor() {
/*
这里的 @Pointcut 注解表示一个切入点，它的名称为 requestInterceptor()，
并且使用 @annotation(com.easypan.annotation.GlobalInterceptor) 作为切入点表达式，
意味着这个切入点会匹配所有被 @GlobalInterceptor 注解标注的方法。
 */
    }
/*
这段代码使用了 @Before 注解来定义一个前置通知（Before Advice）
并且指定了切入点表达式为 requestInterceptor()，
意味着该前置通知会在所有被 @GlobalInterceptor 注解标注的方法执行之前执行。
-------------
具体来说，这个前置通知方法的名称为 interceptorDo()，
它接收一个 JoinPoint 对象作为参数，在方法体中可以编写实际的业务逻辑。

 */
    @Before("requestInterceptor()")
    public void interceptorDo(JoinPoint point) throws NoSuchMethodException {
        Object target = point.getTarget();
        Object[] arguments = point.getArgs();
        String methodName = point.getSignature().getName();
        Class<?>[] parameterTypes = ((MethodSignature) point.getSignature()).getMethod().getParameterTypes();
        Method method = target.getClass().getMethod(methodName, parameterTypes);
        GlobalInterceptor interceptor = method.getAnnotation(GlobalInterceptor.class);
        if (null == interceptor) {
            return;
        }
        /*
        这段代码的作用是判断目标方法是否被@GlobalInterceptor注解标记，
        如果没有，则直接返回，不执行后续的切面逻辑。
         */
/**
 * 校验登录  --效验登录true 效验管理员
 */
  if (interceptor.checkLogin() || interceptor.checkAdmin()) {
             checkLogin(interceptor.checkAdmin());
         }

    }

    private void checkLogin(Boolean checkAdmin) {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        HttpSession session = request.getSession();
        SessionwebUserDto sessionUser = (SessionwebUserDto) session.getAttribute("session_key");
        if (sessionUser != null) {
            //根据条件查询 数据库
           //根据userid ->数据库中查询是否有对应
            String userid= String.valueOf(sessionUser.getUserId());
            if(userid==null)
            {
                //异常抛出
                throw new BusinessException("用户错误");
            }
            //查询是否有对应的值
            UserInfo userInfo = userMapper.selectByuserid(Integer.parseInt(userid));
            if(userInfo==null)
            {

                throw new BusinessException("用户错误");
            }
            return;
        }

            throw new BusinessException(ResponseCodeEnum.CODE_901);

    }
}
